import java.util.ArrayList;
import java.util.List;

/**
 * @作者 zxy
 * @时间 2023-04-27 12:20
 * @说明 54. 螺旋矩阵
 * 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
 * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * 输出：[1,2,3,6,9,8,7,4,5]
 */
public class Solution {
    /**
     * 执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户
     * 内存消耗：39.7 MB, 在所有 Java 提交中击败了35.96% 的用户
     * @param matrix
     * @return
     */
    public List<Integer> spiralOrder(int[][] matrix) {
        int row = matrix.length;
        int column = matrix[0].length;
        int i = 0, j = 0;
        int num = 0;
        List<Integer> res = new ArrayList<>();
        int direction = 1;
        while (num < row * column) {
            res.add(matrix[i][j]);
            matrix[i][j] = -101;
            num++;
            if (direction == 1) {
                if (j + 1 < column && matrix[i][j + 1] != -101) {
                    j++;
                } else if (i + 1 < row && matrix[i + 1][j] != -101) {
                    i++;
                    direction = 2;
                } else if (j - 1 >= 0 && matrix[i][j - 1] != -101) {
                    j--;
                    direction = 3;
                } else if (i - 1 >= 0 && matrix[i - 1][j] != -101) {
                    i--;
                    direction = 4;
                }
            } else if (direction == 2) {
                if (i + 1 < row && matrix[i + 1][j] != -101) {
                    i++;
                } else if (j - 1 >= 0 && matrix[i][j - 1] != -101) {
                    j--;
                    direction = 3;
                } else if (i - 1 >= 0 && matrix[i - 1][j] != -101) {
                    i--;
                    direction = 4;
                } else if (j + 1 < column && matrix[i][j + 1] != -101) {
                    j++;
                    direction = 1;
                }
            } else if (direction == 3) {
                if (j - 1 >= 0 && matrix[i][j - 1] != -101) {
                    j--;
                } else if (i - 1 >= 0 && matrix[i - 1][j] != -101) {
                    i--;
                    direction = 4;
                } else if (j + 1 < column && matrix[i][j + 1] != -101) {
                    j++;
                    direction = 1;
                } else if (i + 1 < row && matrix[i + 1][j] != -101) {
                    i++;
                    direction = 2;
                }
            } else {
                if (i - 1 >= 0 && matrix[i - 1][j] != -101) {
                    i--;
                } else if (j + 1 < column && matrix[i][j + 1] != -101) {
                    j++;
                    direction = 1;
                } else if (i + 1 < row && matrix[i + 1][j] != -101) {
                    i++;
                    direction = 2;
                } else if (j - 1 >= 0 && matrix[i][j - 1] != -101) {
                    j--;
                    direction = 3;
                }
            }
        }
        return res;
    }
}
